/**
 * 删掉一个元素以后全为 1 的最长子数组
 * 给你一个二进制数组 nums ，你需要从中删掉一个元素。
 * 请你在删掉元素的结果数组中，返回最长的且只包含 1 的非空子数组的长度。
 * 如果不存在这样的子数组，请返回 0 。
 */
/**
 * @param {number[]} nums
 * @return {number}
 */
var longestSubarray = function(nums) {
    /**
     * 思路：
     * 1. 用一个数组记录每个 0 左边和右边的 1 的个数
     * 2. 遍历数组，找到最大的 0 的左右两边的 1 的个数之和
     * 3. 如果 0 的个数大于等于 2，则返回数组中最大的 1 的个数
     * 4. 如果 0 的个数等于 1，则返回数组中最大的 1 的个数加 1
     * 5. 如果 0 的个数等于 0，则返回数组中最大的 1 的个数减 1
     * 6. 时间复杂度 O(n)，空间复杂度 O(n)
     */

    let n = nums.length;
    let left = new Array(n).fill(0);
    let right = new Array(n).fill(0);
    let res = 0;

    for (let i = 0; i < n; i++) {
        if (nums[i] === 1) {
            left[i] = (i === 0 ? 0 : left[i - 1]) + 1;
        }
    }

    for (let i = n - 1; i >= 0; i--) {
        if (nums[i] === 1) {
            right[i] = (i === n - 1 ? 0 : right[i + 1]) + 1;
        }
    }

    for (let i = 0; i < n; i++) {
        if (nums[i] === 0) {
            if (i === 0) {
                res = Math.max(res, right[i + 1]);
            } else if (i === n - 1) {
                res = Math.max(res, left[i - 1]);
            } else {
                res = Math.max(res, left[i - 1] + right[i + 1]);
            }
        }
    }

    if (res === 0) {
        return n - 1;
    }
    return res;
};